AVAudioSessionCategoryPlayAndRecordと接続機器ごとの音量


概要

ハマっていたのではい。

このモードだと出力される音量に制限がかかる。

その制限がいろいろ接続機器で変わるね~という話。



要件

1.マイクを使って録音したい

→AVAudioSessionに対して AVAudioSessionCategoryPlayAndRecord をセットする

これは、Unityでmicrophoneクラスを使ってRecordとかやった場合も同じ挙動になる。


このカテゴリーの最中、iOSから出力されるオーディオは、最大音量にしてだいたい70%カットくらいのキャップをセットされる。

理屈としてはまあそりゃそうで、録音してるはずなんでスピーカーから変な音出さんほうがええやろ、という。

この状態で音が出るのは録音と同時に音が出る、プレイバック用途っぽい。


で、この状態だと、どんな出力装置が「どう」iPhoneに接続されているかで音量に対するキャップの挙動が変わる。


2.録音した音を別の端末で再生したい

したかった。1で録音、そんで別端末で再生。



まずは、1の、どんな出力装置が「どう」AVAudioSessionCategoryPlayAndRecord カテゴリ中のiPhoneに接続されているかで、

音量に対するキャップの挙動が変わる という話から。


接続なんもなし

iPhoneに特別なんの出力装置も接続しない場合、iPhoneのスピーカーから出力される音量は、

AVAudioSessionのカテゴリの影響 = 音量キャップ を受ける。



スピーカー、ヘッドフォンがプラグで刺されている場合

キャップなしの音量でサウンドが再生される。

・録音中な可能性もあるけど、別に出力装置をつないでそっちで音がでるくらいええやろ

・オーディオアウトの処理に対してそのまま音を出す

みたいな考慮がされてる気がする。



スピーカー、ヘッドフォンが、Lightning端子、無線で接続されている場合

面白いのは、、これだ、、!!


LightningかBluetoothでヘッドフォンをつなぐ場合、そのスピーカー、ヘッドフォンから出る音量は、

AVAudioSessionのカテゴリの影響 = 音量キャップ を受ける。


なぜなのか。



ドキュメント

https://developer.apple.com/documentation/avfoundation/avaudiosessioncategoryplayandrecord


特にそういう無線接続した場合のみうんぬんみたいなデフォルト挙動については特に書いてない。


AVAudioSessionCategoryOptionDefaultToSpeaker とかの、AVAudioSessionCategoryPlayAndRecordカテゴリの時だけ有効なオプションを追っていくと把握できそう。

今回はデフォルト(オプションなし)だったので、この挙動だったぽい。


あとはまーー、、もう音声出力のプラグって新しいiPhone機種にはないので、無線出力も既存スピーカーといっしょくたに扱おう、みたいなのがデフォルトなのかも。


要件1のまとめ

・AVAudioSessionCategoryPlayAndRecord カテゴリだと、音量にキャップがつく

・接続機器が有線か無線かでキャップの処理に差がでる

有線プラグで接続して不意に爆音が出て死にかけた。



つづいて要件2。



2.録音した音を別の端末で再生したい

ここでは、AVAudioSessionCategoryPlayAndRecord カテゴリで録音した音をファイルとかに吐き出して、

別端末で受け取って再生する、みたいなことをする。


で、

当然だけど、AVAudioSessionCategoryPlayAndRecord で録音した「音」それ自体には、同カテゴリ特有のキャップはかかっていない。


再生側でばふつーに録音時の音量で再生される、ということがわかった。